/**
 * 
 */
package com.lifeware.research.endo.controllers;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.lifeware.research.endo.controllers.utils.ControllersUtils;
import com.lifeware.research.endo.models.SchedaBaseSummary;
import com.lifeware.research.endo.models.utils.EncryptException;
import com.lifeware.research.endo.views.PazienteProxy;

/**
 * <p>Controllore per le azioni possibili su una malattia. Principalmente, il 
 *    controller effettua la redirezione verso il controller definito per una
 *    specifica malattia.
 * </p> 
 *
 * @author  Riccardo Cardin, (C) 2012 Lifeware
 * @version 1.0
 *
 */
@Controller
public class MalattiaController {
	
	private static final String EDIT = "edit";
	private static final String VIEW = "view";
	private static final String SFU = "sfu";   // Scheda follow-up
	
	private static final String REDIRECT = "redirect:";
	
	@Autowired
	private ControllersUtils controllersUtils;
	
	/**
	 * <p>Inserisce il paziente nella sessione attiva.
	 * </p>
	 * 
	 * @param paziente
	 * @param model
	 * @param session La sessione dell'utente.
	 * @return
	 * @throws EncryptException Nel caso in cui l'anonimizzazione del paziente 
	 *                          non vada a buon fine.
	 */
	@RequestMapping(value="/paziente/crea", method=RequestMethod.POST)
	public String instradaMalattia(PazienteProxy paziente, Model model, HttpSession session) 
	throws EncryptException {
		
		/* Effettuo l'anonimizzazione del paziente */
		this.controllersUtils.anonimizza(paziente);
		
		/* Recupero il controller della malattia corrispondente al paziente */
		IMalattieController malattiaController = 
				this.controllersUtils.getMalattiaController(paziente);
		
		/* Inserisco il paziente nella sessione */
		session.setAttribute("paziente", paziente);
		
		/* 
		 * Effettuo il redirect verso il controller corretto per 
		 * la malattia 
		 */
		return "redirect:" + 
			malattiaController.getRedirectResourceForSchedaBaseIns();
	}
	
	@RequestMapping(value="/paziente/malattia/operation")
	public String recuperaDettaglioMalattia(SchedaBaseSummary malattiaPaziente, String operazione, Model model, HttpSession session) {
		
		/* Recupero il controller per il dettaglio della malattia */
		IMalattieController malattieController = 
				this.controllersUtils.getMalattiaController(
						malattiaPaziente.getMalattia());
		
		/* Inserisco le informazioni in sessione */
		session.setAttribute("malattiaPaziente", malattiaPaziente);
		
		/* Scelgo l'operazione da effettuare sulla scheda */
		String redirect = null;
		switch (operazione) {
		case VIEW:
			
			/* Visualizzazione */
			redirect = REDIRECT + 
				malattieController.getRedirectResourceForSchedaBaseDettaglioView();
			break;
		case EDIT:
			
			/* Modifica */
			redirect = REDIRECT + 
					malattieController.getRedirectResourceForSchedaBaseDettaglioEdit();
			break;
		case SFU:
			
			/* Nuova scheda follow-up */
			redirect = REDIRECT +
					malattieController.getRedirectResourceForSchedaFollowupIns();
			break;
		default:
			/* Nessun caso di defaults */
			break;
		}   // end switch (operazione)...
		
		return redirect;
	}
	
	@RequestMapping(value="/paziente/malattia/indietro")
	public String pulisciSessionePaziente(HttpSession session) {
		
		/* Rimuovo dalla sessione il codice fiscale del paziente */
		session.removeAttribute("codFiscale");
		session.removeAttribute("idMalattia");
		
		return "redirect:/paziente";
	}

	public ControllersUtils getControllersUtils() {
		return controllersUtils;
	}

	public void setControllersUtils(ControllersUtils controllersUtils) {
		this.controllersUtils = controllersUtils;
	}

}
